__author__ = 'maikel'

from utilsP4 import *
import random
import numpy as np

#%matplotlib inline

# Carreguem les dades de la borsa mitjacant la funcio loadStockData
data={}
#companies=['GOOG','MSFT','IBM','YHOO','FB']
companies=['GOOG']
for c in companies:
    data[c]=loadStockData(c)

class SlidWin:
    """
        Finestra lliscant que permet trobar la mitja d'una serie de dades de mida maxima W_size.
        Aquesta finestra lliscant recalcula la mitja amb les formules d'increment i decrement que es troben mes abaix d'aquest fitxer.
    """
    def __init__(self, W_size):
        """
            Constructor que inicialitza els parametres per la finestra lliscant.
            param W_size Mida maxima de la finestra lliscant.
        """
        self.data = [] # dades
        self.W_size = W_size # tamany de la finestra
        self.length = 0 # length actual de la finestra
        self.m = 0.0 # mitja de la finestra

    def add(self, x_t):
        """
            Afegeix una nova dada a la finestra i retorna la mitja d'aquesta i el valor de l'accio:.
            return 	new_mean,  1  : si la mitja ha disminuit
					new_mean, -1  : si la mitja ha augmentat
        """

        if self.length < self.W_size:
            self.length += 1
        else:
            self.data.remove(self.data[0])

        self.data.append(x_t)
        m = np.mean(self.data)

        action = 0
        if (m < self.m):
            action = 1
        else:
            action = -1

        self.mean = m

        return self.mean, action


# PROVA AMB DADES SINTETIQUES

# Sliding window amb un tamany de finestra ==10
method1 = SlidWin(10)
# Sliding window amb un tamany de finestra ==50
method2 = SlidWin(50)

v=[] # Genera un mostra de 400 + 600 valors amb un canvi brusc entre 400 i 401.
for i in xrange(100):
    v.append(0.6+0.1*(random.random()-0.5))
for i in xrange(200):
    v.append(0.4+0.1*(random.random()-0.5))

# Anem afegint de forma sequencial les dades dins la nostra finestra lliscant. Guardem
# el resultat dins la llista output1 i output2
output1=[]
output2=[]
for item in v:
        mean,action=method1.add(item)
        output1.append(mean)
        mean,action=method2.add(item)
        output2.append(mean)


# Visualitzem el resultat
#pylab.plot(v)
#pylab.plot(output1,'r') # plot del resultat del Metode 1
#pylab.plot(output2,'g') # plot del resultat del Metode 2
#pylab.show()


# Prova amb dades de la Borsa utilizant l'estrategia basica que us donem
method = SlidWin(10)
for item in data:
    # Creem un objecte broker. Aquest objecte cada cop que entrem una nova dada dira si hem de comprar o vendre accions
    # per_change indica el percentatge de canvi respecte al valor de l'accio per realitzar una compra/venta
    # min_time indica el temps minim que ens hem d'esperar per fer nova accio de compra/venta
    per_change=0.1
    min_time=10
    broker= StockMarketWin(method,per_change,min_time)
    # Executem l'estrategia de comprar a partir de l'objecte broker i les dades d'entrada. La funcioestrategiaBasica
    # esta definidia dins utilsP4.py. Ella es la responsable de decidir la quantatit de compra o venta d'accios a partir de la
    # suggeriencia del broker
    temp_badget,invested_money,non_strategy= estrategiaBasica(broker,data[item])
    # Mostrem els resultats per pantalla
    print_results(data[item],temp_badget,invested_money,non_strategy)
